From: robertl Date: Sun, 20 Jun 2010 04:18:31 +0000 (+0000) Subject: Endianness fixes for garmin_xt. X-Git-Tag: archive/raspbian/1.10.0+ds-2+rpi1~1^2~12^2~17^2 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=7795fb918860f24e4cc84bb0808585981f10b8aa;p=gpsbabel.git Endianness fixes for garmin_xt. --- diff --git a/garmin_xt.c b/garmin_xt.c index 9fbdf63e0..468a49484 100644 --- a/garmin_xt.c +++ b/garmin_xt.c @@ -107,15 +107,15 @@ format_garmin_xt_rd_st_attrs(char *p_trk_name, unsigned char *p_track_color) // set to RED if not specified *p_track_color=9; - gbfread(&trackbytes, 2, DATABLOCKSIZE, fin); - gbfread(&TrackPoints, 2, DATABLOCKSIZE, fin); + trackbytes = gbfgetuint16(fin); + TrackPoints = gbfgetuint16(fin); switch (method) { case 1: break; // IGNORE /* TODO: SHIFT - can't test behaviour, do not have appropriate files case 2: { // SHIFTED method - gbfread(&spam, 1, DATABLOCKSIZE, fin); + spam = gbfgetc(fin); gbfread(&trk_name, 30, DATABLOCKSIZE, fin); gbfseek(fin, -1, SEEK_CUR); for (ii = 0; ii<29; ii++) @@ -126,13 +126,13 @@ format_garmin_xt_rd_st_attrs(char *p_trk_name, unsigned char *p_track_color) break; */ default: { // NORMAL - gbfread(&spam, 1, DATABLOCKSIZE, fin); + spam = gbfgetc(fin); gbfread(&trk_name, 30, DATABLOCKSIZE, fin); gbfseek(fin, -1, SEEK_CUR); } break; } - gbfread(&spam, 1, DATABLOCKSIZE, fin); + spam = gbfgetc(fin); gbfread(&TrackMaxLat, 3, DATABLOCKSIZE, fin); gbfread(&spam, 1, DATABLOCKSIZE, fin); @@ -254,7 +254,7 @@ format_garmin_xt_proc_strk(void) gbfseek(fin, 12, SEEK_SET); // read # of tracks - gbfread(&NumberOfTracks, 2, DATABLOCKSIZE, fin); + NumberOfTracks = gbfgetuint16(fin); // Skip 2 bytes gbfseek(fin, 2, SEEK_CUR); @@ -360,6 +360,8 @@ format_garmin_xt_proc_atrk(void) double LatF = 0, LonF = 0, AltF = 0; waypoint *wpt; int method = 0; + unsigned char buf[3]; + uint32_t num_trackpoints; // get the option for the processing the track name if ( opt_trk_header ) @@ -377,14 +379,22 @@ format_garmin_xt_proc_atrk(void) track_add_head(track); } - // Skip 18 bytes - gbfseek(fin, 18, SEEK_SET); - while (!gbfeof( fin ) ) { - gbfread(&Lat, 3, DATABLOCKSIZE, fin); //1. Lat - gbfread(&Lon, 3, DATABLOCKSIZE, fin); //2. Lon - gbfread(&uu, 2, DATABLOCKSIZE, fin); //3. Ele - gbfread(&Tim, 4, DATABLOCKSIZE, fin); //4. Garmin Time - gbfread(&block, 2, DATABLOCKSIZE, fin); //0. ?Record delimiter? + // We think the word at offset 0xc is the trackpoint count. + gbfseek(fin, 12, SEEK_SET); + num_trackpoints = gbfgetuint32(fin); + + while (num_trackpoints--) { + block = gbfgetuint16(fin); + if (block != 0x0c) + break; + + gbfread(&buf, 3, DATABLOCKSIZE, fin); //1. Lat + Lat = buf[0] | (buf[1] << 8) | (buf[2] << 16); + gbfread(&buf, 3, DATABLOCKSIZE, fin); //2. Lon + Lon = buf[0] | (buf[1] << 8) | (buf[2] << 16); + + uu = gbfgetuint16(fin); + Tim = gbfgetuint32(fin); Tim += 631065600; // adjustment to UnixTime LatF = Lat;